package com.multithreading.chart1.waitAndnotify;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @program: java-multithreading
 * @description: 测试共享变量的锁获取变化
 * @author: 陈庆彪
 * @create: 2020-06-26 11:12
 **/
public class SynchronizedTest {
    public static void main(String[] args) {
        Queue queue=new LinkedList();
        //生产线程
        synchronized (queue){
            //消费队列满，则等待队列空闲
            while(queue.size() == 8){
                try{
                    //挂起当前线程，并释放通过同步块获取的queue上的锁，让消费线程可以获取该锁，然后获取队列里的元素。
                    queue.wait();
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
            //空闲则生成元素，并通知消费者线程
            queue.add("sss");
            queue.notifyAll();
        }
        //消费线程
        synchronized (queue){
            //消费队列为空
            while (queue.size()==0){
                try{
                    //挂起当前线程，并释放通过同步块获取的queue上的锁，让生产者线程可以获取该锁，将生产元素放入队列。
                    queue.wait();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            //消费元素，并通知唤醒生产线程。
            queue.remove();
            queue.notifyAll();
        }
        System.out.println("线程执行次数"+queue);
    }
}
